package algo_annotations.data;

import commons.params_appli.ParamsAppli;
import commons.errors.ErrorsHandler;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.FontMetrics;
import java.awt.font.FontRenderContext;
import java.awt.font.GlyphVector;
import java.awt.font.TextLayout;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import javax.swing.JOptionPane;


public class MyFont {

	private Font font;
	private boolean bOK;

	// Pour calculer la taille de police necessaire pour avoir une certaine hauteur en pixel (hauteur d'une lettre majuscule)
	private float pt_per_px;

	// Facteur pour passer de la hauteur d'une majuscule (utilisée par l'algo) a la hauteur totale
	//  -> utilisé pour l'export des données, il faut indiquer la hauteur réelle de la police
	public double rapportHauteurTotaleHauteurMajuscule;

	public boolean isOk() {return bOK;}

	// Désormais, on utilise les Font installées sur le système
//	static public ArrayList<String> getListFont() {
//		ArrayList<String> vRes = new ArrayList<String>();
//
//		File repFont = new File(ParamsAppli.getParam("Autogene.REPERTOIRE_POLICES"));
//		if (repFont.exists() && repFont.isDirectory()) {
//			for (File f : repFont.listFiles()) {
//				if (f.getName().toLowerCase().endsWith(".ttf"))
//					vRes.add(f.getName());
//			}
//			if (!vRes.isEmpty())
//				return vRes;
//		}
//
//		// Arrivé là, il s'agit d'une erreur
//		JOptionPane.showMessageDialog(null, "Le répertoire suivant ne contient aucune police (type .TTF) :\n -> " +
//					ParamsAppli.getParam("Autogene.REPERTOIRE_POLICES") + "\n\nVeuillez relancer l'application après avoir corrigé les paramètres d'application.",
//					"Erreur", JOptionPane.ERROR_MESSAGE);
//		return vRes;
//	}
	

	public MyFont(String fontName) {
		try {
			font = new Font(fontName, Font.PLAIN, 600);// un peu grosse pour avoir des calculs de dimension précis
			
			AffineTransform tx = new AffineTransform();
			FontRenderContext frc = new FontRenderContext(tx, true, true);

			// Hauteur des caracteres majuscules "normaux" (ie. hors accents, "p", "(", etc.)
			GlyphVector gv = font.createGlyphVector(frc, "A");
			double hauteurMajuscule = gv.getPixelBounds(frc, 0, 0).getHeight();

			// calcul hauteur totale police / hauteur majuscule
			gv = font.createGlyphVector(frc, "ÄAj(gê");
			double hauteurTotale = gv.getPixelBounds(frc, 0, 0).getHeight();


			pt_per_px = (float) (600f / hauteurMajuscule);

			rapportHauteurTotaleHauteurMajuscule = hauteurTotale / hauteurMajuscule;
			
			bOK = true;
			
		} catch (Exception ex) {
			ErrorsHandler.addError("Erreur à la création de la police " + fontName);
			bOK = false;
		}
	}

	public Font getFont() {
		return font;
	}

	public void setSize (float hauteur_px) {
		font = font.deriveFont(hauteur_px * pt_per_px);
	}

	public double getTextWidth (String text, double height) {
		Font fontGrosse = font.deriveFont(100f); // un peu grosse pour avoir des calcul de dimension précis

		AffineTransform tx = new AffineTransform();
		FontRenderContext frc = new FontRenderContext(tx, true, true);

		// Hauteur des caractères normaux (ie. hors accents, "p", "(", etc.)
		GlyphVector gv = fontGrosse.createGlyphVector(frc, "A");
		double hauteurStandard = gv.getPixelBounds(null,0,0).getHeight();

		// Largeur du texte demandé
		gv = fontGrosse.createGlyphVector(frc, text);
		double largeurTextFourni = gv.getPixelBounds(null,0,0).getWidth();

		double ratio = largeurTextFourni / hauteurStandard;
		//ratio = largeurTextFourni / gv.getPixelBounds(null,0,0).getHeight();
		return height * ratio;
	}


}
